 ADD R0,ARGP,#STRACC
 BL OSCLIREGS
 SWI CLI
 B NXT
SYSNAME ADD R1,ARGP,#STRACC
 MOV R0,#0
 STRB R0,[CLEN]
 SWI SWINUMBERFROMSTRING
 B SYSGOTSWINUMB
SYS0STRING MOV R0,#0
 STRB R0,[CLEN],#1
 LDR R7,[ARGP,#FSA]
 LDMFD SP!,{R0,R4,R5,R6}
 STMIA R7!,{R0,R4,R5,R6}
 LDMFD SP!,{R0,R4,R5,R6}
 STMIA R7!,{R0,R4,R5,R6}
 LDMFD SP!,{R0,R4,R5,R6}
 STMIA R7!,{R0,R4,R5,R6} ;move 12 words from stack to free memory
 BL SPUSH
 LDMDB R7!,{R0,R4,R5,R6} ;move 12 words back from free memory
 STMFD SP!,{R0,R4,R5,R6}
 LDMDB R7!,{R0,R4,R5,R6}
 STMFD SP!,{R0,R4,R5,R6}
 LDMDB R7!,{R0,R4,R5,R6}
 STMFD SP!,{R0,R4,R5,R6}
 ADD IACC,SP,#11*4+4+4 ;11 words on stack plus string length plus R4
 B SYS0PUSH
SYS BL AEEXPR
 TEQ TYPE,#0
 BEQ SYSNAME
 BLMI SFIX
SYSGOTSWINUMB MOV TYPE,SP ;initial SP in R9/TYPE
 STMFD SP!,{IACC} ;save action
 MOV R4,#0
 MOV R5,#0
 MOV R6,#0
 MOV R7,#0
 STMFD SP!,{R4-R7,R9} ;R9=TYPE
 STMFD SP!,{R4-R7}
 STMFD SP!,{R4,R5} ;save 10 register holes and old sp
 CMP R10,#","
 BNE SYSCALL
;note R4 (SYS register index) already 0
SYS0 CMP R4,#10
 BCS ERSYSINPUTS
SYS0SPACES LDRB R10,[AELINE],#1
 CMP R10,#" "
 BEQ SYS0SPACES
 CMP R10,#","
 BEQ SYS0END
 STMFD SP!,{R4}
 SUB AELINE,AELINE,#1
 BL EXPR
 TEQ TYPE,#0
 BEQ SYS0STRING
 BLMI SFIX
SYS0PUSH LDMFD SP!,{R4}
 STR IACC,[SP,R4,LSL #2]
SYS0END ADD R4,R4,#1
 CMP R10,#","
 BEQ SYS0
SYSCALL MOV LINE,AELINE
 ADD AELINE,ARGP,#STRACC
 LDR R4,[SP,#10*4] ;old sp
 LDR R5,[R4,#-4] ;SWI call value
 BIC R5,R5,#&FF000000
 LDR R6,SYSDATA
 ORR R6,R6,R5
 STR R6,[AELINE]
 LDR R6,SYSDATA+4
 STR R6,[AELINE,#4]
 CMP R10,#TTO
;Do IMB here to make SYS StrongARM compatible
 MOV R0,#0
 SWI XOSSYNCHRONISECODEAREAS
;----
 BEQ SYSCALLTO
 BL DONE
 LDMFD SP!,{R0-R9} ;get parameters from stack
 MOV R14,PC
 MOV PC,AELINE
 MOV ARGP,#VARS
 LDR SP,[SP] ;pop stack and continue
 B NXT
SYSCALLTO LDMFD SP!,{R0-R9} ;get parameters from stack
 MOV R14,PC
 MOV PC,AELINE
 STMFD SP!,{R0-R9,PC} ;write parameters back to stack
 MOV ARGP,#VARS
 MOV R7,#0
SYS1 CMP R7,#10
 BCS ERSYSOUTPUTS
 STMFD SP!,{R7}
 BL CRAELV
 LDMFD SP!,{R7}
 BEQ SYS1COMMA
 MOV R4,IACC
 MOV R5,TYPE
 LDR IACC,[SP,R7,LSL #2]
 MOV TYPE,#TINTEGER
 CMP R5,#128
 BCC SYS1END
 MOV TYPE,#0
 ADD CLEN,ARGP,#STRACC
 ADD R3,CLEN,#256
SYS1STRING LDRB R1,[IACC],#1
 STRB R1,[CLEN],#1
 TEQ CLEN,R3
 TEQNE R1,#13
 TEQNE R1,#0
 TEQNE R1,#10
 BNE SYS1STRING
 TEQ CLEN,R3
 SUBEQ CLEN,CLEN,#255
 SUB CLEN,CLEN,#1
SYS1END STMFD SP!,{R7}
 BL STOREA
 LDMFD SP!,{R7}
SYS1ENDA ADD R7,R7,#1
 MOV LINE,AELINE
SYS1SPACES LDRB R10,[LINE],#1
 CMP R10,#" "
 BEQ SYS1SPACES
 CMP R10,#","
 BEQ SYS1
 CMP R10,#";"
 BNE SYSEXIT
 BL CRAELV
 BEQ ERSYNT
 MOV R4,IACC
 MOV R5,TYPE
 LDR IACC,[SP,#10*4]
 MOV IACC,IACC,LSR #28
 MOV TYPE,#TINTEGER
 BL STOREA
 MOV LINE,AELINE
 BL SPACES
SYSEXIT LDR SP,[SP,#11*4] ;recover old SP
 B DONEXT
SYS1COMMA BL SPACES
 CMP R10,#","
 CMPNE R10,#";"
 SUBEQ AELINE,LINE,#1
 BEQ SYS1ENDA
 B ERSYNT
SYSDATA SWI 0
 MOV PC,R14
CALL BL AEEXPR
 BL INTEGY
 CMP R10,#","
 BEQ CALLARM
 BL AEDONE
 MOV TYPE,IACC
 [ FP=0
 BL EMUMOS
 BNE NXT
 ]
 MOV R4,TYPE
 MOV R5,#0
 B CALLARMGO
CALLARM MOV R4,IACC
 MOV R5,#0
CALLARMP